package http

import (
	"forum/app/gateway/rpc"
	pb "forum/idl/pb/comment"
	"forum/pkg/ctl"
	"github.com/gin-gonic/gin"
	"net/http"
)

// CommentCreate 创建评论
func CommentCreate(ctx *gin.Context) {
	var commentReq pb.CommentRequest
	if err := ctx.ShouldBind(&commentReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	commentReq.UserID = user.Id
	r, err := rpc.CommentCreate(ctx, &commentReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "CommentCreate RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// CommentUpdate 更新评论
func CommentUpdate(ctx *gin.Context) {
	var commentReq pb.CommentRequest
	if err := ctx.ShouldBind(&commentReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	commentReq.UserID = user.Id
	r, err := rpc.CommentUpdate(ctx, &commentReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "CommentUpdate RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// CommentDelete 删除评论
func CommentDelete(ctx *gin.Context) {
	var commentReq pb.CommentRequest
	if err := ctx.ShouldBind(&commentReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	commentReq.UserID = user.Id
	r, err := rpc.CommentDelete(ctx, &commentReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "CommentDelete RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// CommentList 获取帖子所有评论
func CommentList(ctx *gin.Context) {
	var commentReq pb.CommentRequest
	if err := ctx.ShouldBind(&commentReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	commentReq.UserID = user.Id
	r, err := rpc.CommentList(ctx, &commentReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "CommentList RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}

// CommentGet 获取用户所有评论
func CommentGet(ctx *gin.Context) {
	var commentReq pb.CommentRequest
	if err := ctx.ShouldBind(&commentReq); err != nil {
		ctx.JSON(http.StatusBadRequest, ctl.RespError(ctx, err, "参数绑定错误"))
		return
	}
	// 从上下文中提取当前登录用户信息，这个信息不是来自前端传的参数，而是中间件（如认证 JWT 后）注入的
	user, err := ctl.GetUserInfo(ctx.Request.Context())
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "获取用户信息错误"))
		return
	}
	commentReq.UserID = user.Id
	r, err := rpc.CommentGet(ctx, &commentReq)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, ctl.RespError(ctx, err, "CommentGet RPC调用错误"))
		return
	}

	ctx.JSON(http.StatusOK, ctl.RespSuccess(ctx, r))
}
